package ar.com.arkios.kfcon4d.util;

import ar.com.arkios.j4d.opData;
import ar.com.arkios.j4d.opDataArray;
import ar.com.arkios.j4d.opField;
import ar.com.arkios.j4d.opFieldArray;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;

/**
 * <p>
 * Esta clase permite crear registros representados a través de la API de 4D. Es
 * decir, administra la creación de un opDataArray a partir de un opFieldArray
 * dado.
 * </p>
 * 
 * <p>
 * Para la utilización de esta clase, siempre se debe indicar el opFieldArray al 
 * cual estará asociado el registro a crear. Se le debe indicar la estructura
 * del registro a construir (esta está contenida el el opFieldArray).
 * </p>
 * 
 * <p>
 * Provee métodos para la asignación de datos al registro a través del nombre de
 * los campos que contiene le registro. De esta manera el usuario no deberá
 * conocer la estructura del registro ni códigos identificatorios manejados por
 * la API de 4D. Simplemente se deberá indicar el nombre del campo al que se 
 * desea asignar el valor.
 * </p>
 */
public class RegisterBuilder {

    /**  */
    private opFieldArray miFiledArray;
    
    private HashMap<String, opField> miFields;
    
    /** */
    private opDataArray miDataArray;
    
    /**
     * Constructor de la clase. Si o si se debe indicar el opFieldArray que 
     * contiene la estructura del registro que se desea crear.
     * 
     * @param fieldArray opFieldArray 
     */
    public RegisterBuilder(opFieldArray fieldArray) {
        this.miFiledArray = fieldArray;
        this.miDataArray = new opDataArray(fieldArray.mSize);
        
        
        this.miFields = new HashMap<String, opField>();
        
        for (opField field : fieldArray.mFieldArray) {
            this.miFields.put(field.mFieldName, field);
        }
    }
    
    public void setData(String fieldName, String value) {
        int pos = EstructuraUtil.getFieldPosition(this.miFiledArray, fieldName);
        
        if (pos != EstructuraUtil.NO_FIELD_FOUND) {
            opField field = miFields.get(fieldName);
            
            this.miDataArray.mDataArray[pos] = new opData(field.mFieldType, value);
        }
    }
    
    public void setData(String fieldName, char value) {
        int pos = EstructuraUtil.getFieldPosition(this.miFiledArray, fieldName);
        
        if (pos != EstructuraUtil.NO_FIELD_FOUND) {
            opField field = miFields.get(fieldName);
            
            this.miDataArray.mDataArray[pos] = new opData(field.mFieldType, Character.toString(value));
        }
    }
    
    public void setData(String fieldName, Date value) {
        int pos = EstructuraUtil.getFieldPosition(this.miFiledArray, fieldName);
        
        if (pos != EstructuraUtil.NO_FIELD_FOUND) {
            opField field = miFields.get(fieldName);//opField field = EstructuraUtil.findField(this.miFiledArray, fieldName);
        
            GregorianCalendar gc = new GregorianCalendar();
            gc.setTime(value);
            this.miDataArray.mDataArray[pos] = new opData(field.mFieldType, gc);
        }
    }
    
    public void setData(String fieldName, boolean value) {
        int pos = EstructuraUtil.getFieldPosition(this.miFiledArray, fieldName);
        
        if (pos != EstructuraUtil.NO_FIELD_FOUND) {
            opField field = miFields.get(fieldName);//opField field = EstructuraUtil.findField(this.miFiledArray, fieldName);
            
            this.miDataArray.mDataArray[pos] = new opData(field.mFieldType, value);
        }
    }
    
    public void setData(String fieldName, double  value) {
        int pos = EstructuraUtil.getFieldPosition(this.miFiledArray, fieldName);
        
        if (pos != EstructuraUtil.NO_FIELD_FOUND) {
            opField field = miFields.get(fieldName);//opField field = EstructuraUtil.findField(this.miFiledArray, fieldName);
            
            this.miDataArray.mDataArray[pos] = new opData(field.mFieldType, value);
        }
    }
    
    public void setData(String fieldName, int value) {
        int pos = EstructuraUtil.getFieldPosition(this.miFiledArray, fieldName);
        
        if (pos != EstructuraUtil.NO_FIELD_FOUND) {
            opField field = miFields.get(fieldName);//opField field = EstructuraUtil.findField(this.miFiledArray, fieldName);
            
            this.miDataArray.mDataArray[pos] = new opData(field.mFieldType, value);
        }
    }
    
    public void setData(String fieldName, short value) {
        int pos = EstructuraUtil.getFieldPosition(this.miFiledArray, fieldName);
        
        if (pos != EstructuraUtil.NO_FIELD_FOUND) {
            opField field = miFields.get(fieldName);//opField field = EstructuraUtil.findField(this.miFiledArray, fieldName);
            
            this.miDataArray.mDataArray[pos] = new opData(field.mFieldType, value);
        }
    }
    
    public void setData(String fieldName, byte[] value) {
        int pos = EstructuraUtil.getFieldPosition(this.miFiledArray, fieldName);
        
        if (pos != EstructuraUtil.NO_FIELD_FOUND) {
            opField field = miFields.get(fieldName);//opField field = EstructuraUtil.findField(this.miFiledArray, fieldName);
            
            this.miDataArray.mDataArray[pos] = new opData(field.mFieldType, value);
        }
    }
    
    /**
     * <p>
     * Devuelve el data array construido hasta el momento de su invocación.
     * </p>
     * 
     * @return opDataArray conteniendo los datos que fueron asignados al builder
     *      hasta el momento.
     */
    public opDataArray getDataArray() {
        return this.miDataArray;
    }
    
}
